/**
 * 飞行棋初始在0格，目标为N格。有M个骰子，上面必然为1-6点之一
 * 对每个骰子，依次用或者不用，问最少用几个可以到N
 * 注意：如果用了y点，且距离终点只有x格且x<y，则此步之后棋子会停留在y-x格，y-x可以为负!!!
 * 因为y-x可以为负，所以首先需要设置一个offset，因为点数最多6，所以10就足够了
 * 然后对于冲出终点的操作，可以换算出它应该落到的点，即可进行计算
 * Dij表示用到第i个骰子到j格所需的最小步数，由于j可能跟后面的点有关，因此使用刷表法
 * 对于每一个已知的Dij，它会影响到D[i+1][j+A[i]]的数值
 * 如果 j+A[i] 超出了终点，则换算回来即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>

using llt = long long;
using vi = vector<int>;

int N, M;
vi A;
vector<vi> D;

int mymin(int a, int b){
    if(-1 == a) return b;
    if(-1 == b) return a;
    return min(a, b);
}

int myadd(int a, int b){
    if(-1 == a or -1 == b) return -1;
    return a + b;
}

int proc(){
    int const offset = 10;
    int const limit = N + offset;
    D.assign(M + 1, vi(limit + offset, -1));

    
    D[0][offset] = 0;
    for(int i=0;i<M;++i){
        D[i + 1].assign(D[i].begin(), D[i].end());
        for(int j=0;j<limit;++j){
            int rj = j + A[i + 1];
            if(rj - offset > N){
                auto cha = rj - offset - N;
                cha = N - cha;
                rj = cha + offset;
            }
            // cout << "i = " << i << ", rj = " << rj << endl;
            D[i + 1][rj] = mymin(D[i + 1][rj], myadd(1, D[i][j]));
        }
        int x =4;
    }
    return D[M][N + offset];
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> N >> M;
    A.assign(M + 1, 0);
    for(int i=1;i<=M;++i)cin >> A[i];
    cout << proc() << endl;    
    return 0;
}